package com.lmz.project.multitudethread.interrupttest;

public class InterruptTest {
    public static void basic() {
        Thread testThread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println();
            }
        });

        testThread.interrupt();         //是给线程设置中断标志;  其作用是中断此线程（此线程不一定是当前线程，而是指调用该方法的Thread实例所代表的线程）

        testThread.isInterrupted();     //只检测中断;  作用于此线程，即代码中调用此方法的实例所代表的线程;作用是只测试此线程是否被中断 ，不清除中断状态。
        testThread.interrupted();       //是检测中断并清除中断状态； 作用于当前线程(作用是测试当前线程是否被中断（检查中断标志），返回一个boolean并清除中断状态，第二次再调用时中断状态已经被清除，将返回一个false)
        Thread.interrupted();           //同上



        //************************************

        testThread.interrupt(); //设置指定testThread线程的状态为中断标志，

        testThread.isInterrupted();// 检测当前testThread线程是否被外界中断；是则返回true
        testThread.interrupted();//检测当前testThread线程是否收到中断信令，收到信令则返回true且清除中断状态，重新变更为false；
        Thread.interrupted();//静态方法，与testThread.interrupted()一样，（检测当前testThread线程是否被中断，如果被中断则返回true且清除中断状态，重新变更为未中断状态；） 作用于当前被执行线程，由于testThread内部线程在执行的时候，是无法获取testThread引用的，所以如果想检测当前自己的线程是否被中断且清除中断状态，则可以使用Thread.interrupted()方法；


        //如上，其实关于线程中断一共也就上述三个方法，其中interrupt()和isInterrupted() 是线程实例方法，interrupted()则是线程的静态方法；
        //isInterrupted()是线程实例方法，所以，线程内部执行代码中是无法获取testThread的引用的所以无法执行实例方法isInterrupted()；
        //但其实，我们可以通过在线程内部执行代码中使用 Thread.currentThread()获取当前线程的实例，此时使用Thread.currentThread().isInterrupted() 的方式来调用isInterrupted()方法；等价于testThread.isInterrupted();
        //等价与：线程外部做检测用：testThread.isInterrupted(); 线程内部做检测用：Thread.currentThread().isInterrupted()
    }
}
